SQL Advanced

내장함수
SQL의 함수는 DBMS가 제공하는 내장함수(built-in function)과
사용자가 필요에 따라 정의하는 사용자 정의 함수(user-defined function)으로 나뉜다.

SQL 내장함수는 상수나 속성 이름을 입력 값으로 받아 단일 값을 결과로 반환한다.
숫자 함수


문자 함수


날짜 및 시간 함수


NULL 값 처리
NULL 값은 비교 연산자로 비교가 불가능함
NULL 값과 산술 연산을 수행하면 동이하게 NULL을 반환
집계 함수 계산시 NULL이 포함된 값은 집계에서 빠진다.

해당되는 행이 없을 경우 SUM, AVG 함수의 결과는 NULL이 되며, COUNT 함수는 0

ROWNUM
내장 함수는 아니지만 자주 사용되는 문법이다.
오라클에서 내부적으로 생성되는 가상 컬럼으로 SQL 조회 결과의 순번을 나타낸다.
부속 질의(Subquery)
하나의 SQL문 안에 다른 SQL 문이 중첩된 질의
다른 테이블에서 가져온 데이터로 현재 테이블에 있는 정보를 찾거나 가공할 때 사용
보통 데이터가 대량일 때 데이터를 모두 합쳐서 연산하는 조인보다 필요한 데이터만 찾아서 공급해주는 부속질의가 성능이 좋다

주질의(main Query, 외부질의)와 부속질의(sub Query, 내부질의)로 구성된다.
스칼라 부속질의(Scalar Subquery)- SELECT 부속질의
SELECT절에서 사용되는 부속질의, 부속질의의 결과값을 단일 행, 단일 열의 스칼라 값으로 반환한다.

스칼라 부속질의는 원칙적으로 스칼라 값이 들어갈 수 있는 모든 곳에 사용 가능하며,
일반적으로 SELECT 문과 UPDATE SET 절에 사용된다.

인라인 뷰(Inline View)-FROM의 부속질의
FROM 절에서 사용되는 부속질의
부속질의 결과 반환되는 데이터는 다중 행, 다중 열이어도 상관없다.

가상 테이블인 뷰 형태로 제공되어 상관 부속질의로 사용될 수는 없다.

중첩 질의(Nested Subquery)-WHERE 부속질의
WHERE 절에서 사용되는 부속질의
보통 데이터를 선택하는 조건 혹은 술어(predicate)와 같이 사용된다.
중첩질의를 술어 부속질의(Predicate Subquery)라고도 한다.

부속질의 결과 반환되는 데이터는 다중 행, 다중 열이어도 상관없다.

가상 테이블인 뷰 형태로 제공되어 상관 부속질의로 사용될 수는 없다.
    뷰(View)
하나 이상의 테이블을 합하여 만든 가상의 테이블
편리성: 미리 정의된 뷰를 일반 테이블처럼 사용할 수 있기 때문에 편리하다. 사용자가 필요한 정보만 요구에 맞게 가공 가능
재사용성: 자주 사용되는 질의를 뷰로 미리 정의할 수 있다.
보안성: 각 사용자별로 필요한 데이터만 선별하여 보여줄 수 있다. 중요한 질의는 내용을 암호화 할 수 있다.
- 뷰 생성
CREATE VIEW 뷰이름 [(열이름 [, … n])]
AS SELECT 문

- 뷰의 수정
CREATE OF REPLACE VIEW 뷰이름 [(열이름 [, …n])]
AS SELECT 문

- 뷰의 삭제
DROP VIEW 뷰이름 [, …n];
    인덱스(Index)
데이터베이스의 물리적 저장
데이터가 저장되는 곳: 하드디스크, SSD, USB 메모리

인덱스: 데이터를 쉽고 빠르게 찾을 수 있도록 만든 데이터 구조
인덱스

인덱스의 특징
인덱스는 테이블에서 한 개 이상의 속성을 이용하여 생성한다.
빠른 검색과 함께 효율적인 레코드 접근이 가능하다
순서대로 정렬된 속성과 데이터의 위치만 보유함으로 테이블보다 작은 공간을 차지한다.
저장된 값들은 테이블의 부분집합이 된다.
일반적으로 B-tree 형태의 구조를 가진다.
데이터의 수정, 삭제 등의 변경이 발생하면 인덱스의 재구성이 필요하다.
(B-Tree)

(Index 구조)
인덱스의 생성
인덱스는 WHERE절에 자주 사용되는 속성이어야 한다.
인덱스는 Join 에 자주 사용되는 속성이어야 한다.
단일 테이블에 인덱스가 많으면 속도가 느려질 수 있다.
속성이 가공되는 경우에 사용하지 않는다.
속성의 선택도가 낮을 때 유리하다

CREATE [REVERSE] | [UNIQUE] INDEX 인덱스 이름
ON 테이블이름 (컬럼 [ASC | DESC] [{, 컬럼 [ASC | DESC]} …])[;]
인덱스 재구성과 삭제
인덱스의 재구성은 ALTER INDEX 명령을 사용
DROP INDEX를 사용해서 인덱스 삭제